/*
 * NodoTrie.cpp
 *
 *  Created on: 23/10/2011
 *      Author: diego
 */

#include "NodoTrie.h"

NodoTrie::NodoTrie(char c) {
	int i;
	for (i = 0; i < 36; i++){
		this->hijos[i] = NULL;
	}

	this->c = c;
	this->finTermino = false;
}

size_t NodoTrie::posicion(char c){
	if (c <= 57 && c >= 48){
		// es un numero
		return c - 48;
	}else if (c <= 122 && c >= 97){
		// es una minuscula
		return 10 + (c - 97);
	}
	//cout << "fuera de rango!!!";

	return -1;
}

void NodoTrie::setFinTermino(){
	this->finTermino = true;
}

char NodoTrie::getChar(){
	return this->c;
}

bool NodoTrie::esFinTermino(){
	return this->finTermino;
}

void NodoTrie::insertar(string termino, size_t pos_c){
	//cout << termino << endl;
	size_t size = termino.length();
	if (size <= pos_c){
		//es fin de termino
		this->finTermino = true;
		//cout << endl;
		return;
	}

	char c = termino[pos_c];
	int pos = this->posicion(c);
	if (pos >= 0 && pos < 36){
		if (this->hijos[pos] == NULL){
			NodoTrie* nodo = new NodoTrie(termino[pos_c]);
			this->hijos[pos] = nodo;
		}
		//cout << termino[pos_c];

		this->hijos[pos]->insertar(termino, pos_c+1);
	}
	return;
}

bool NodoTrie::buscar(string termino, size_t pos_c){
	size_t size = termino.length();
	if (size <= pos_c){
		//llegue al final, checkeo si es fin de termino
		return this->esFinTermino();
	}

	char c = termino[pos_c];
	int pos = this->posicion(c);
	if (pos < 0){
		return false; //es un caracter no valido de stopword
	}

	if (this->hijos[pos] == NULL){
		return false;
	}else{
		return this->hijos[pos]->buscar(termino, pos_c + 1);
	}
}

void NodoTrie::grabar(ofstream* fd, string termino){

	termino.push_back(this->getChar());

	if (this->esFinTermino()){
		// grabo el termino
		char saltoLinea = '\n';
		fd->write(termino.c_str(), termino.length());
		fd->write(&saltoLinea, 1);
	}

	int i;
	for (i = 0; i < 36; i++){
		if (this->hijos[i] != NULL){
			this->hijos[i]->grabar(fd, termino);
		}
	}
}

NodoTrie::~NodoTrie() {
	int i;
	for (i = 0; i < 36; i++){
		delete this->hijos[i];
	}
}

